package com.javaweb.controller

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
import com.javaweb.pojo.SysMessage
import com.javaweb.pojo.SysVote
import com.javaweb.pojo.VoteOption
import com.javaweb.service.SysMessageService
import com.javaweb.service.SysVoteService
import com.javaweb.service.VoteOptionService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import java.text.DateFormat
import java.util.*

/**
 * 管理员的请求
 * @author Siaze
 * @date 2021/12/11
 */
@Controller
class AdminController : BaseController() {

    @Autowired
    lateinit var dateTimeFormat: DateFormat

    /**
     * sysVoteService是sys_vote表（投票表）查询工具，可以通过自定义查询条件查询数据
     */
    @Autowired
    lateinit var sysVoteService: SysVoteService

    /**
     * sysMessageService是sys_message表（留言表）查询工具，可以通过自定义查询条件查询数据
     */
    @Autowired
    lateinit var sysMessageService: SysMessageService

    /**
     * voteOptionService是vote_option表（投票选项表）查询工具，可以通过自定义查询条件查询数据
     */
    @Autowired
    lateinit var voteOptionService: VoteOptionService


    /**
     * 管理员查看投票数据
     * @PreAuthorize("hasAuthority('ADMIN')") 管理员才可以访问
     * @RequestMapping("/edit/{voteId}") 管理员查看表的页面 ，voteId为投票的id
     * @param voteId 投票项目的id
     * @param model 传送到前台的数据对象
     */
    @PreAuthorize("hasAuthority('ADMIN')")
    @RequestMapping("/edit/{voteId}")
    fun viewVote(@PathVariable voteId: Long, model: Model): String {
        /*
            通过id查询sys_vote的基本数据
         */
        val sysVote = sysVoteService.getById(voteId)
        /*
           查询投票项的留言
        */
        sysVote.message = sysMessageService.list(QueryWrapper<SysMessage>().eq("vote_id", sysVote.voteId))
        /*
           查询投票项的选项
        */
        sysVote.options = voteOptionService.list(QueryWrapper<VoteOption>().eq("vote_id", sysVote.voteId))
        /*
            查询留言人的用户名
         */
        (sysVote.message as MutableList<SysMessage>?)?.forEach {
            it.userName = sysUserService?.getById(it.userId)?.userName
        }
        /*
            设置数据
         */
        model["data"] = sysVote
        /*
            判断投票是否截止
         */
        if (sysVote.endTime!!.before(Date())) {
            model["choose"] = "投票已超过截止时间"
        }
        /*
            设置跳转的页面
         */
        return "teacherView"
    }

    /**
     * 管理员添加投票页面
     * @PreAuthorize("hasAuthority('ADMIN')") 管理员才能查看
     * @RequestMapping("/create") 访问的链接
     */
    @PreAuthorize("hasAuthority('ADMIN')")
    @RequestMapping("/create")
    fun create(): String {
        /*
            设置跳转的页面
         */
        return "addVote"
    }

    /**
     * 添加投票的操作
     * @PreAuthorize("hasAuthority('ADMIN')") 管理员才能查看
     * @RequestMapping("/create") 访问的链接
     * @param endTime 截止时间
     * @param options 投票的选项
     * @param voteContent 投票的简介
     */
    @PreAuthorize("hasAuthority('ADMIN')")
    @RequestMapping("/addVote")
    fun addVote(
        @RequestParam("endTime") endTime: String,
        @RequestParam("vote_option") options: Array<String>,
        @RequestParam("vote_title") voteTitle: String,
        @RequestParam("vote_content") voteContent: String,
    ): String {
        /*
            构造对象保存至数据库
         */
        val sysVote = SysVote()
        sysVote.voteTitle = voteTitle
        sysVote.startTime = Date()
        sysVote.endTime = dateTimeFormat.parse(endTime)
        sysVote.createBy = getSysUserId()
        sysVote.voteContent = voteContent
        sysVoteService.save(sysVote)

        /*
            依次保存选项
         */
        for (optionName in options) {
            val voteOption = VoteOption()
            voteOption.optionName = optionName
            voteOption.voteId = sysVote.voteId
            voteOptionService.save(voteOption)
        }
        /*
            重定向到主页
         */
        return "redirect:/index"
    }

    /**
     * 管理员删除留言
     * @PreAuthorize("hasAuthority('ADMIN')") 管理员才能查看
     * @RequestMapping("deleteMessage/{messageId}") 访问链接
     * @param messageId 留言id
     */
    @PreAuthorize("hasAuthority('ADMIN')")
    @RequestMapping("deleteMessage/{messageId}")
    fun deleteMessage(@PathVariable messageId: Long): String {
        /*
            获取留言所在表id，用于返回页面
         */
        val byId = sysMessageService.getById(messageId)
        /*
            删除留言
         */
        sysMessageService.removeById(messageId)
        /*
            重定向页面
         */
        return "forward:/edit/".plus(byId.voteId)
    }

    /**
     * 管理员删除投票
     * @PreAuthorize("hasAuthority('ADMIN')") 管理员才能查看
     * @RequestMapping("deleteMessage/{messageId}") 访问链接
     * @param voteId 投票id
     */
    @PreAuthorize("hasAuthority('ADMIN')")
    @RequestMapping("deleteVote/{voteId}")
    fun deleteVote(@PathVariable voteId: Long): String {
        /**
         * 设置投票为delete状态
         */
        sysVoteService.update(UpdateWrapper<SysVote>().eq("vote_id", voteId).set("is_delete", true))
        /*
             重定向到主页
          */
        return "redirect:/index"
    }
}